#pragma once

#include <stdint.h>
#include <thread>
#include <string>

using namespace std;

typedef uint8_t u8;
typedef uint16_t u16;
typedef uint32_t u32;
typedef uint64_t u64;

typedef int8_t s8;
typedef int16_t s16;
typedef int32_t s32;
typedef int64_t s64;

#define CMD_DEVICE_SCAN 0x01
#define CMD_DEVICE_INFO 0x03
#define CMD_DEVICE_ONLINE 0x05
#define CMD_DEVICE_CTRL 0x07
#define CMD_DEVICE_CTRL_ACK 0x08
#define CMD_DEVICE_REFRESH 0x09
#define CMD_DEVICE_REFRESH_ACK 0x0A
#define CMD_DEVICE_REBOOT 0x0B
#define CMD_DEVICE_REBOOT_ACK 0x0C
#define CMD_DEVICE_CLOSE 0x0D

#define DEVICE_SCAN_BROADCAST_PORT 8899
#define DEVICE_SCAN_HEADER 0x55
#define DEVICE_SCAN_PACK_MAX_LEN 1024

#define DEVICE_CTRL_PORT 12345

#define SPK_ERR_NONE 0
#define SPK_ERR_PACKET_HEADER -2
#define SPK_ERR_PACKET_TYPE -3
#define SPK_ERR_PACKET_LEN -4
#define SPK_ERR_PACKET_CHECKSUM -5

/* 网络类型 */
#define NET_CARD_WIRED 0
#define NET_CARD_WIFI 1
#define NET_CARD_4G_MODULE 2

/* 平台接入方式，目前支持GB28181 */
#define PLATFORM_GB28181 0

/* SIP传输协议 */
#define SIP_PROTOCAL_UDP 0
#define SIP_PROTOCAL_TCP 1

/* SIP协议版本 */
#define SIP_VERSION_GBT28181_2016 0

/* 抓拍图片格式，目前仅支持bmp */
#define IMAGE_FORMAT_BMP 0
#define IMAGE_FORMAT_JPEG 1

/* 抓拍时间单位 */
#define IMAGE_TIME_UNIT_MILLISECOND 0
#define IMAGE_TIME_UNIT_SECOND 1
#define IMAGE_TIME_UNIT_MINUTE 2
#define IMAGE_TIME_UNIT_HOUR 3
#define IMAGE_TIME_UNIT_DAY 4

#ifndef _WIN32
typedef void *HWND;
#define REUSE_PORT(_fd_)         \
    int opt = 1;                 \
    socklen_t len = sizeof(opt); \
    setsockopt(_fd_, SOL_SOCKET, SO_REUSEADDR, &opt, len);

#else
#define MSG_DEVICE_INFO (WM_USER + 1)
#define MSG_DEVICE_CTRL (WM_USER + 2)
#define REUSE_PORT(_fd_)
#endif

#pragma pack(1)
struct device_info
{

    u8 device_name[128]; /* 设备名称 */ // 可能出现中文

    u8 platform_type; /* 平台接入方式 */

    /* 网络配置 */
    u8 net_card_type;   /* 网络类型: 有线网络/无线网络/4G模块 */
    u8 auto_ip_addr;    /* 是否使用自动获取IP地址 */
    u8 ip_addr[4];      /* IP地址 */
    u8 sub_net_mask[4]; /* 子网掩码 */
    u8 gate_way[4];     /* 网关 */
    u8 major_dns[4];    /* 首选DNS服务器 */
    u8 minor_dns[4];    /* 备用DNS服务器 */

    /* SIP配置 */
    u8 sip_server_connect;    /* 是否连接sip服务器 */
    u16 sip_local_port;       /* 本地端口 */
    u8 sip_protocal_type;     /* 协议类型: UDP/TCP */
    u8 sip_protocal_version;  /* 协议版本 */
    u8 sip_server_id[32];     /* 服务器ID */
    u8 sip_server_domain[32]; /* 服务器域名 */
    u8 sip_server_ip_addr[4]; /* 服务器IP地址 */
    u16 sip_server_port;      /* 服务器IP端口 */
    u8 sip_password[32];      /* 服务器密码 */
    u8 sip_user_name[128];    /* 用户名 */
    u8 sip_user_id[32];       /* 用户ID */

    u16 sip_register_timeout_second; /* 注册服务器有效时间，单位为秒 */

    /* 视频配置 */
    u16 video_iw; /* 视频宽度 */
    u16 video_ih;
    u16 video_encode_bps; /* 视频编码码率 */
    u16 video_frame_rate; /* 视频帧率 */

    /* OSD配置 */
    u8 osd_channel_name[128]; /* 通道名称 */ // 可能出现中文
    u8 osd_en_channel_name;                  /* 显示通道名称 */
    u8 osd_en_week_info;                     /* 显示通道名称 */
    u8 osd_en_date_info;                     /* 显示通道名称 */
    u8 osd_time_format;                      /* 时间格式 */
    u8 osd_date_format;                      /* 日期格式 */
    u8 osd_info[4][128]; /* OSD显示信息 */   // 可能出现中文
    u16 osd_info_location[4][2];             /* OSD显示位置信息 */

    /* 抓拍配置 */
    u8 capture_en_start;         /* 是否开启抓拍 */
    u8 image_format;             /* 图片格式 */
    u32 capture_time_interval;   /* 抓拍时间间隔 */
    u8 capture_time_unit;        /* 抓拍时间单位 */
    u8 capture_en_save_server;   /* 抓拍是否保存到服务器 */
    u8 capture_server_url[128];  /* 上传服务器地址 */
    u8 capture_every_week[7][3]; /* 每周抓拍的时间点 */

    /* 录像配置 */
    u8 record_en_start;         /* 是否开启录像 */
    u8 record_every_week[7][3]; /* 每周录像的时间点 */

    u8 time[7][24];
};
#pragma pack()

int init_file_encode(std::string file_name, struct device_info *info);
int init_file_decode(std::string file_name, struct device_info *info);

#include <iconv.h>

// 转换结果：0-成功，1-输入为空，2-转换失败，3-缓冲区溢出
#define CONVERT_SUCCESS 0
#define CONVERT_NULL_INPUT 1
#define CONVERT_FAIL 2
#define CONVERT_BUFFER_OVERFLOW 3

int utf8_to_gb2312(uint8_t buff[128]);
int gb2312_to_utf8(uint8_t buff[128]);
